using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/**
    服务基类 
    Service用于处理游戏中的业务逻辑（网络游戏作为远端服务的代理，通过网络系统与服务器通信
    注意：Service无状态，不要在Service中保存状态，状态应该保存在Model中
*/
public class Service
{
    public virtual void OnInit() {
    }

    public virtual void OnUpdate(float deltaTime) {
    }

    public virtual void OnDestroy() {
    }
}

/**
    服务管理器
    管理所有服务
*/
public class ServiceManager
{
    private Dictionary<Type, Service> _services = new Dictionary<Type, Service>();

    static ServiceManager _instance;

    // 单例
    public static ServiceManager Instance {
        get {
            if (_instance == null) {
                _instance = new ServiceManager();
            }
            return _instance;
        }
    }

    // 注册服务
    // 只能在启动之前调用.
    public void RegisterService(Service service) {
        if (_services.ContainsKey(service.GetType())) {
            throw new Exception($"Service {service.GetType()} already registered");
        }
        _services[service.GetType()] = service;
    }

    // 获取服务
    public static T GetService<T>() where T : Service {
        if (Instance._services.TryGetValue(typeof(T), out var service)) {
            return (T)service;
        }

        // 如果访问到一个不存在的服务，属于严重错误，需要抛出异常
        throw new Exception($"Service {typeof(T)} not found");
    }

    // 获取服务
    public Service GetService(Type type) {
        return _services[type];
    }

    // 初始化服务
    public void Init() {
        foreach (var service in _services) {
            service.Value.OnInit();
        }
    }
}   